package String类oj.检测字符串是否为回文字符串;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 姚东名
 * Date: 2024-06-20
 * Time: 14:14
 */
//3.检测字符串是否为回文
/*class Solution {
    public boolean isPalindrome(String s) {
        s = s.toLowerCase();
        int left = 0;
        int right = s.length() - 1;
        while (left < right) {
            while (left < right && !(isNumberAndCharacter(s.charAt(left)))) {
                left++;
            }
            while (left < right && !(isNumberAndCharacter(s.charAt(right)))) {
                right--;
            }
            if (s.charAt(left) == s.charAt(right)) {
                left++;
                right--;
            } else {
                return false;
            }
        }
        return true;
    }

    private boolean isNumberAndCharacter(char ch) {
        //用isDigit() : 判断字符是否为数字
        //用isLetter() : 判断字符是否为字母
        if (Character.isDigit(ch) || Character.isLetter(ch)) {
            return true;
        } else {
            return false;
        }
    }
}*/

class Solution {
    public boolean isPalindrome(String s) {
        //所有大写字符转换为小写字符:
        s = s.toLowerCase();
        //开始判断：定义两个索引：一个从左边开始， 一个从右边开始，进行对比
        int left = 0;
        int right = s.length() - 1;
        //开始对比：
        while(left < right) {
            //遇到非字母和非数字就跳过，不进行比较
            while(left < right && !isNumberAndCharacter(s.charAt(left))) {
                left++;
            }
            while(left < right && !isNumberAndCharacter(s.charAt(right))) {
                right--;
            }
            //走到这，证明字符都是字母，可以进行对比
            if(s.charAt(left) == s.charAt(right)) {
                left++;
                right--;
                //对比完，就往下走
            }else {
                //不相同，说明不是回文串
                return false;
            }
        }
        //走到这，证明是回文串
        return true;
    }

    //字母和数字都属于字母数字字符。 -> 假如是非字母和非数字就跳过，不进行比较
    private boolean isNumberAndCharacter(char ch) {
        //用isDigit() : 判断字符是否为数字
        //用isLetter() : 判断字符是否为字母
        if(Character.isDigit(ch) || Character.isLetter(ch)) {
            return true;
        }else {
            return false;
        }
    }
}
public class Test {
    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.isPalindrome("A man, a plan, a canal: Panama"));
    }
}

/*
这段代码定义了一个Solution类，其中包含两个方法：isPalindrome和isNumberAndCharacter。这个类的主要功能是检查一个字符串是否是一个“回文串”，即正读和反读都相同的字符串。

isPalindrome方法：
首先，该方法将输入字符串s转化为小写，以确保大小写不影响回文的判断。
定义了两个指针，left从字符串的开始位置出发，right从字符串的末尾位置出发。
使用一个while循环，当left小于right时执行循环体内的代码。
在循环体内，代码会跳过left指针位置上的非字母和非数字字符，直到找到第一个字母或数字字符。
同样，代码也会跳过right指针位置上的非字母和非数字字符，直到找到第一个字母或数字字符。
接着，比较left和right指针位置上的字符是否相同。如果相同，则将两个指针向中间移动；如果不同，则直接返回false，表示该字符串不是回文串。
如果left指针超过了right指针，说明已经检查完整个字符串，且字符串是回文的，所以返回true。

isNumberAndCharacter方法：
这个辅助方法用于检查一个字符是否是字母或数字。
使用Character.isDigit(ch)检查字符ch是否为数字。
使用Character.isLetter(ch)检查字符ch是否为字母。
如果字符是数字或字母，则返回true；否则返回false。
总的来说，这段代码通过双指针的方法，从字符串的两端向中间遍历，同时跳过非字母和非数字的字符，来判断一个字符串是否是回文串。
 */
